import sys

from PyQt6 import uic
from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QWidget, QPushButton, QListWidget, QListWidgetItem, QComboBox

from EXFAT.EXFAT import EXFAT
from Pages.ScanFileWindow import ScanFileWindow


class OperateWindow:
    """
    OperateWindow 类用于管理一个包含磁盘选择、类型选择和按钮的窗口。
    """

    def __init__(self, parent, disks):
        """
        初始化窗口，加载UI，设置按钮和视图。

        :param parent: 父窗口对象
        :param disks: 磁盘列表
        """
        self.children = None
        self.disk = None
        self.cache_disk = None
        self.buttons = None  # 存储按钮的列表
        self.combo_box = None  # 存储组合框的引用
        self.disk_view = None  # 存储磁盘视图的引用

        self.current_disk_type = None  # 当前选中的磁盘类型
        self.current_disk = None  # 当前选中的磁盘
        self.parent = parent  # 父窗口的引用

        # 加载UI文件并设置窗口标题和图标
        self.ui: QWidget = uic.loadUi("./UI/second.ui")
        self.ui.setWindowTitle("FormatRecovery")
        self.ui.setWindowIcon(QIcon("./FormatRecovery.ico"))
        self.ui.show()

        # 初始化按钮
        self.init_buttons()
        # 初始化磁盘视图
        self.init_view(disks)
        # 初始化组合框
        self.init_box()

    def init_buttons(self):
        """
        初始化窗口中的按钮，并连接它们的点击事件。
        """
        cancel_button: QPushButton = self.ui.cancel  # 取消按钮
        next_button: QPushButton = self.ui.next  # 下一个按钮
        self.buttons = [cancel_button, next_button]

        cancel_button.clicked.connect(lambda: self.cancel())  # 连接取消按钮的点击事件
        next_button.clicked.connect(lambda: self.next())  # 连接下一个按钮的点击事件

    def init_view(self, disks: list[str]):
        """
        初始化磁盘视图，将磁盘列表添加到视图中，并连接视图的点击事件。

        :param disks: 磁盘列表
        """
        disk_view: QListWidget = self.ui.findChild(QListWidget, 'diskView')  # 找到磁盘视图控件
        self.disk_view = disk_view

        for i in disks:
            disk_view.addItem(i)  # 将每个磁盘添加到视图中

        disk_view.itemClicked.connect(self.set_disk)  # 连接视图的点击事件

    def init_box(self):
        """
        初始化组合框，并连接其选择变化的事件。
        """
        combo_box: QComboBox = self.ui.findChild(QComboBox, 'comboBox')  # 找到组合框控件
        self.combo_box = combo_box

        self.current_disk_type = combo_box.currentText()  # 获取当前选中的磁盘类型（这里可能在组合框有初始项时有效）
        combo_box.currentIndexChanged.connect(self.set_disk_type)  # 连接组合框的选择变化事件

    def set_disk(self, item: QListWidgetItem):
        """
        设置当前选中的磁盘。

        :param item: 被点击的列表项
        """
        self.current_disk = item.text()  # 获取被点击项的文本作为当前磁盘

    def set_disk_type(self):
        """
        设置当前选中的磁盘类型。
        注意：这里应该接收一个参数（如当前索引或文本），但当前没有接收。
        """
        self.current_disk_type = self.combo_box.currentText()  # 获取当前选中的磁盘类型

    def cancel(self):
        """
        取消操作，关闭当前窗口并显示父窗口。
        """
        self.ui.close()
        self.parent.ui.show()

    def next(self):
        """
        下一步操作。
        """
        # TODO 下一步事件（《2/3》.下一个界面暂时还没有设计）
        if self.current_disk_type == "EXFAT":
            if self.cache_disk != self.current_disk:
                self.ui.setDisabled(True)
                self.disk = EXFAT(self.current_disk)
                self.cache_disk = self.current_disk
        else:
            return
        self.ui.close()
        self.children = ScanFileWindow(self.disk, self)
